/***********************************************************************/
/*  													               */
/*      PROJECT NAME :  RTOSDemo_GCC                                   */
/*      FILE         :  reset_program.asm                              */
/*      DESCRIPTION  :  Reset Program                                  */
/*      CPU SERIES   :  RX100                                          */
/*      CPU TYPE     :  RX111                                          */
/*  													               */
/*      This file is generated by e2studio.                        */
/*  													               */
/***********************************************************************/



	/*reset_program.asm*/

	.list
	.section .text
	.global _PowerON_Reset    /*global Start routine */

	.extern _HardwareSetup  /*external Sub-routine to initialise Hardware*/
	.extern _data
	.extern _mdata
	.extern _ebss
	.extern _bss
	.extern _edata
	.extern _main
	.extern _ustack
	.extern _istack
	.extern _rvectors
	.extern _exit


_PowerON_Reset :
/* initialise user stack pointer */
	mvtc	#_ustack,USP

/* initialise interrupt stack pointer */
	mvtc	#_istack,ISP

/* setup intb */
	mvtc	#_rvectors_start, intb	/* INTERRUPT VECTOR ADDRESS  definition	*/

/* load data section from ROM to RAM */

	mov     #_mdata,r2      /* src ROM address of data section in R2 */
	mov     #_data,r1       /* dest start RAM address of data section in R1 */
	mov     #_edata,r3      /* end RAM address of data section in R3 */
	sub    r1,r3            /* size of data section in R3 (R3=R3-R1) */
	smovf                   /* block copy R3 bytes from R2 to R1 */

/* bss initialisation : zero out bss */

	mov	#00h,r2  	/* load R2 reg with zero */
	mov	#_ebss, r3  /* store the end address of bss in R3 */
	mov	#_bss, r1 	/* store the start address of bss in R1 */
	sub   r1,r3	   	/* size of bss section in R3 (R3=R3-R1) */
	sstr.b
/* call the hardware initialiser */
	bsr.a	_HardwareSetup
	nop

#ifdef RUN_IN_USER_MODE
/* setup PSW */
	mvtc	#10000h, psw			/* Set Ubit & Ibit for PSW */

/* change PSW PM to user-mode */
	MVFC   PSW,R1
	OR     #00100000h,R1
	PUSH.L R1
	MVFC   PC,R1
	ADD    #10,R1
	PUSH.L R1
	RTE
	NOP
	NOP
#endif
#ifdef CPPAPP
    bsr.a	__rx_init
#endif
/* start user program */
	bsr.a	_main
	bsr.a 	_exit

#ifdef CPPAPP
	.global	_rx_run_preinit_array
	.type	_rx_run_preinit_array,@function
_rx_run_preinit_array:
	mov	#__preinit_array_start,r1
	mov	#__preinit_array_end,r2
	bra.a	_rx_run_inilist

	.global	_rx_run_init_array
	.type	_rx_run_init_array,@function
_rx_run_init_array:
	mov	#__init_array_start,r1
	mov	#__init_array_end,r2
	mov	#4, r3
	bra.a	_rx_run_inilist

	.global	_rx_run_fini_array
	.type	_rx_run_fini_array,@function
_rx_run_fini_array:
	mov	#__fini_array_start,r2
	mov	#__fini_array_end,r1
	mov	#-4, r3
	/* fall through */

_rx_run_inilist:
next_inilist:
	cmp	r1,r2
	beq.b	done_inilist
	mov.l	[r1],r4
	cmp	#-1, r4
	beq.b	skip_inilist
	cmp	#0, r4
	beq.b	skip_inilist
	pushm	r1-r3
	jsr	r4
	popm	r1-r3
skip_inilist:
	add	r3,r1
	bra.b	next_inilist
done_inilist:
	rts

	.section	.init,"ax"
	.balign 4

	.global __rx_init
__rx_init:

	.section	.fini,"ax"
	.balign 4

	.global __rx_fini
__rx_fini:
	bsr.a	_rx_run_fini_array

        .section .sdata
        .balign 4
        .global __gp
	.weak   __gp
__gp:

	.section .data
	.global ___dso_handle
	.weak   ___dso_handle
___dso_handle:
	.long	0

     .section        .init,"ax"
     bsr.a   _rx_run_preinit_array
     bsr.a   _rx_run_init_array
     rts

    .global __rx_init_end
__rx_init_end:

    .section        .fini,"ax"

    rts
    .global __rx_fini_end
__rx_fini_end:

#endif

/* call to exit*/
_exit:
	bra  _loop_here
_loop_here:
    bra _loop_here

	.text
	.end
